【JavaScript】this - オブジェクト自身を記憶する変数
JavaScriptのthisについて解説します。
検証環境
this
thisは“オブジェクト自身を記憶する変数”です。
JavaScriptが事前に用意した変数であり、オブジェクトの内部処理(メソッド等)のみで使用可能です。
主にオブジェクトの内部処理から自身のプロパティやメソッドにアクセスする場合に使用します。
基本構文
this
this
はオブジェクトのメソッド等の処理で記述します。
サンプル
let person = {
name: 'TANAKA',
info: function() {
___ih_hl_start
console.log(this);
___ih_hl_end
}
};
person.info();
Object
info: ƒ ()
name: "TANAKA"
4行目でthis
を使用しています。
実行結果からオブジェクトが記憶されていることが確認できます。
this(プロパティ)
thisを使用し、プロパティにアクセスできます。
取得
thisを通してプロパティの値を取得します。
基本構文
this.プロパティ名
サンプル
let person = {
name: 'TANAKA',
info: function() {
___ih_hl_start
console.log("My name is " + this.name);
___ih_hl_end
}
};
person.info();
My name is TANAKA
4行目のthis.name
がthisを使用したプロパティ値の取得です。
実行結果から正常に値を取得できたことが確認できます。
記憶
thisを使用し、プロパティの追加や値の更新を行うことができます。
基本構文
this.プロパティ名 = 値
既に同じプロパティ名が存在する場合は値を更新し、存在しない場合はプロパティを追加します。
サンプル
let person = {
name: 'TANAKA',
age: 24,
info: function() {
console.log("My name is " + this.name);
console.log(this.age + " years old");
},
growup: function() {
___ih_hl_start
this.age += 1;
___ih_hl_end
}
};
person.growup();
person.info();
My name is TANAKA
25 years old
growup
メソッドの9行目がthisを使用したプロパティ値の更新です。
13行目でgrowup
メソッドを呼び出したことにより、age
プロパティの値が1
加算されたことが実行結果から確認できます。
this(メソッド)
thisを使用し、メソッドにアクセスできます。
呼び出し
thisを通して、メソッドを呼び出します。
基本構文
this.メソッド名(実引数)
サンプル
let person = {
name: 'TANAKA',
age: 24,
info: function() {
___ih_hl_start
this.greeting();
___ih_hl_end
console.log("My name is " + this.name);
console.log(this.age + " years old");
},
greeting: function() {
console.log("Hello");
}
};
person.info();
Hello
My name is TANAKA
24 years old
5行目がthisを使用したメソッドの呼び出しです。
実行結果からgreeting
メソッドが正常に呼び出せたことが確認できます。
定義
thisを通して、メソッドを定義(記憶)します。
基本構文
this.メソッド名 = function() {
// 処理...
}
既に同じメソッド名が存在する場合は内容を更新し、存在しない場合はメソッドを追加します。
サンプル
let person = {
name: 'TANAKA',
age: 24,
info: function() {
this.greeting();
console.log("My name is " + this.name);
console.log(this.age + " years old");
},
greeting: function() {
console.log("Hello");
},
updateGreeting: function( grt ) {
___ih_hl_start
this.greeting = grt;
___ih_hl_end
}
};
person.updateGreeting(function() { console.log("Good Morning")});
person.info();
Good Morning
My name is TANAKA
24 years old
13行目がthisを使用したメソッドの定義(記憶)です。
updateGreeting
メソッドはオブジェクト自身のgreeting
メソッドを更新します。
実行結果からgreeting
メソッドの処理が変更されたことが確認できます。
注意点
無名関数とアロー関数はthisが記憶するオブジェクトが異なります。
let obj = {
testA: function() {
console.log(this);
},
testB: () => {
console.log(this);
}
}
obj.testA();
console.log(">>>>>>>>>>");
obj.testB();
{testA: ƒ, testB: ƒ}
testA: ƒ ()
testB: () => { console.log(this); }
>>>>>>>>>>
Window {window: Window, self: Window, document: document, name: '', location: Location, …}
testA
メソッドは無名関数、testB
メソッドはアロー関数です。
各メソッドはconsole.log(this)
でthis
を出力していますが、実行結果から出力内容が異なることが分かります。
無名関数のthisはアクセスしたオブジェクト、アロー関数のthisはWindowオブジェクトを指しています。
WindowオブジェクトはブラウザでJavaScriptを実行した場合、全てのオブジェクトの親となるオブジェクトです。
このような違いがあることに注意し、ソースコードを作成しましょう。